/**
 * native so strip相关
 *
 * @since 2023/11/15
 */
import { glob } from 'glob';

import { NativeConst } from '../const/common-const.js';
import { DebugSymbol } from '../options/build/build-opt.js';

export class SoStripUtil {
  /**
   * 获取basePath下所有符合exclude规则的文件
   *
   * @param collectAllLibs
   * @param exclude exclude规则
   * @param basePath basePath
   * @return basePath下符合规则的文件
   */
  public static matchedFiles(collectAllLibs: boolean | undefined, exclude: string[] | undefined, basePath: string): string[] {
    const matchedFiles: Set<string> = new Set();
    if (exclude) {
      exclude.forEach((pattern) => {
        const files = glob.sync(pattern, { cwd: basePath });
        files.forEach((file) => {
          if (collectAllLibs) {
            matchedFiles.add(file);
          } else {
            const regex = new RegExp(NativeConst.LIBRARY_FILE_REGEXP);
            regex.test(file) ? matchedFiles.add(file) : undefined;
          }
        });
      });
    }
    return Array.from(matchedFiles);
  }

  /**
   * 获取basePath下所有不符合exclude规则的文件
   *
   * @param collectAllLibs
   * @param exclude 排除规则
   * @param basePath basePath
   * @return basePath下排除符合规则的文件
   */
  public static filesExcluding(collectAllLibs: boolean | undefined, exclude: string[] | undefined, basePath: string): string[] {
    return glob.sync(collectAllLibs === true ? NativeConst.LIBRARY_ALL_FILE_PATTERN : NativeConst.LIBRARY_FILE_PATTERN, { cwd: basePath, ignore: exclude }); // 排除需要排除的文件
  }

  /**
   * 判断是否需要strip
   *
   * @param debugSymbol 用户填写的strip选项
   * @return true需要 false不需要
   */
  public static needStrip(debugSymbol: DebugSymbol | undefined): boolean {
    // 如果没配默认为true
    if (!debugSymbol) {
      return true;
    }
    // 如果明确配置为false 则判断exclude是否配置
    if (debugSymbol.strip === false) {
      return !!(debugSymbol.exclude && debugSymbol.exclude.length > 0);
    }
    // 只要没明确写为false 就返回true
    return true;
  }
}
